#ifndef ALARMMODEL_H
#define ALARMMODEL_H

#include <QAbstractListModel>
#include <QList>
#include <QDateTime>
#include "entities/AlarmRecord.h"

/**
 * @brief 报警记录模型
 * @details 继承 QAbstractListModel，为 QML 提供报警数据：
 *          - 从数据库 alarm_records 表加载报警记录
 *          - 支持按设备 ID、报警级别、确认状态过滤
 *          - 支持报警确认操作
 *          - 支持添加新报警记录
 *          - 提供未确认报警统计
 */
class AlarmModel : public QAbstractListModel
{
    Q_OBJECT
    Q_PROPERTY(int count READ count NOTIFY countChanged)
    Q_PROPERTY(int unacknowledgedCount READ unacknowledgedCount NOTIFY unacknowledgedCountChanged)
    Q_PROPERTY(QString deviceIdFilter READ deviceIdFilter WRITE setDeviceIdFilter NOTIFY deviceIdFilterChanged)
    Q_PROPERTY(QString levelFilter READ levelFilter WRITE setLevelFilter NOTIFY levelFilterChanged)
    Q_PROPERTY(bool showOnlyUnacknowledged READ showOnlyUnacknowledged WRITE setShowOnlyUnacknowledged NOTIFY showOnlyUnacknowledgedChanged)

public:
    // 角色枚举（对应 QML 中的属性）
    enum AlarmRoles
    {
        IdRole = Qt::UserRole + 1, // 报警ID
        DeviceIdRole,              // 设备ID
        TimestampRole,             // 时间戳
        AlarmTypeRole,             // 报警类型
        AlarmLevelRole,            // 报警级别
        ParamNameRole,             // 参数名称
        ParamValueRole,            // 参数值
        ThresholdRole,             // 阈值
        DescriptionRole,           // 描述
        AcknowledgedRole,          // 是否已确认
        AcknowledgedByRole,        // 确认人
        AcknowledgedAtRole         // 确认时间
    };
    Q_ENUM(AlarmRoles)

    explicit AlarmModel(QObject *parent = nullptr);
    ~AlarmModel();

    // QAbstractListModel 必须实现的方法
    int rowCount(const QModelIndex &parent = QModelIndex()) const override;
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
    QHash<int, QByteArray> roleNames() const override;

    // 数据数量
    int count() const { return m_alarms.count(); }

    // 未确认报警数量
    int unacknowledgedCount() const;

    // 过滤条件
    QString deviceIdFilter() const { return m_deviceIdFilter; }
    void setDeviceIdFilter(const QString &deviceId);

    QString levelFilter() const { return m_levelFilter; }
    void setLevelFilter(const QString &level);

    bool showOnlyUnacknowledged() const { return m_showOnlyUnacknowledged; }
    void setShowOnlyUnacknowledged(bool show);

    // 从数据库加载报警记录
    Q_INVOKABLE bool loadFromDatabase();

    // 快捷查询方法
    Q_INVOKABLE bool loadRecentAlarms(int hours = 24);
    Q_INVOKABLE bool loadUnacknowledgedAlarms();
    Q_INVOKABLE bool loadAlarmsForDevice(const QString &deviceId);
    Q_INVOKABLE bool loadAlarmsByLevel(const QString &level);
    Q_INVOKABLE bool loadAlarmsDateRange(const QDateTime &start, const QDateTime &end);

    // 添加报警记录
    Q_INVOKABLE bool addAlarmRecord(const QString &deviceId,
                                    const QString &alarmType,
                                    const QString &alarmLevel,
                                    const QString &paramName,
                                    double paramValue,
                                    double threshold,
                                    const QString &description);

    // 确认报警
    Q_INVOKABLE bool acknowledgeAlarm(int index, const QString &userName = "admin");
    Q_INVOKABLE bool acknowledgeAlarmById(int alarmId, const QString &userName = "admin");
    Q_INVOKABLE bool acknowledgeAllAlarms(const QString &userName = "admin");

    // 获取报警记录
    Q_INVOKABLE AlarmRecord getAlarmRecord(int index) const;

    // 删除报警记录
    Q_INVOKABLE bool removeAlarm(int index);
    Q_INVOKABLE bool removeAlarmById(int alarmId);
    Q_INVOKABLE bool clearAllAlarms();

    // 统计方法
    Q_INVOKABLE int getCriticalAlarmCount() const;
    Q_INVOKABLE int getWarningAlarmCount() const;
    Q_INVOKABLE int getInfoAlarmCount() const;

    // 清空过滤条件
    Q_INVOKABLE void clearFilters();

signals:
    // 数量变化信号
    void countChanged();
    void unacknowledgedCountChanged();

    // 过滤条件变化信号
    void deviceIdFilterChanged();
    void levelFilterChanged();
    void showOnlyUnacknowledgedChanged();

    // 报警添加信号
    void alarmAdded(int alarmId);

    // 报警确认信号
    void alarmAcknowledged(int alarmId);

private:
    // 保存报警记录到数据库
    bool saveToDatabase(const AlarmRecord &alarm);

    // 从数据库删除报警记录
    bool deleteFromDatabase(int alarmId);

    // 更新报警确认状态到数据库
    bool updateAcknowledgedStatus(int alarmId, const QString &userName);

    // 构建 WHERE 子句
    QString buildWhereClause() const;

    // 应用过滤条件
    QList<AlarmRecord> applyFilters(const QList<AlarmRecord> &alarms) const;

private:
    QList<AlarmRecord> m_alarms;   // 报警记录列表
    QString m_deviceIdFilter;      // 设备ID过滤
    QString m_levelFilter;         // 报警级别过滤（info/warning/critical）
    bool m_showOnlyUnacknowledged; // 仅显示未确认报警
};

#endif // ALARMMODEL_H
